/* 
    1. 初始化包
    2. 搭建服务器
    3. 连接我们的数据库
*/

// 引入http
const http = require('http');
const app = http.createServer();

var modfiyId = '';

// 解析post 请求数据
const querystring = require('querystring');
// 解析get 请求数据
const url = require('url');

// 引入mongoose 来连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', {
    useNewUrlParser: true , // 版本更新
    useUnifiedTopology: true
})
.then(() => {
    console.log("数据连接成功！");    
}).catch(err => {
    console.log("数据连接失败！" + err); 
})

const myinfor = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        maxlength: [100, '最大不能超过100个字符'],
        minlength: [2, '最小值不能超过2个字符']
    },
    age: {
        type: Number,
        max: [100, '年龄不能大于100岁'],
        min: [18, '年龄不能小于18岁']
    },
    sex:String,
    email:String,
    hobbies: [String],
    collage: String,
    enterDate: {
        type: Date,
        default: Date.now
    }
})

//调用创建集合规则创建集合
const myInfor = mongoose.model('Myinfor', myinfor);

// 导入模板引擎
const template = require('art-template');
const path = require('path');
// 配置模板根路径
template.defaults.root = path.join(__dirname, 'views');
// 导入时间格式化插件
const dateFormat = require('dateformat');
// 挂载时间格式化插件
template.defaults.imports.myformat = dateFormat;

/* 
    静态资源托管 托管 css less img静态资源
    使用 serve-static的返回值进行静态资源托管
    把托管后的返回值挂载在服务器上
*/
// 导入静态资源模块
const serveStatic = require('serve-static');
// 进行静态资源托管
const serve = serveStatic(path.join(__dirname, 'public'));



//实现node js路由功能（调用第三方模块 router npm i route r）
// 引入 router
const Router = require('router');
// 调用我们的这个返回值 也就是我们这里的Router
const router = Router();
//测试路径功能
router.get('/list', async (req, res) => {
    // list 路由
    /*
        get /list 路由
        1. 从数据库里面取数据 find
        2. 把读取到的数据采用 模板引擎展示出来
    */
    let allData = await myInfor.find({});
    // console.log(allData);
    
    let html = template('list',{
        myallData:allData
    })

    res.end(html);
})


router.get('/add', (req, res) => {
    // get 请求 进入到/add 这个路由的时候需要加载我们添加数据页面
    // template('第一个参数是需要加载的模板路径'，'第二个参数是我们需要几张的数据')
    let html = template('index', {});
    res.end(html);
})

// get 提交 req.url
// post 提交 特别是表单提交 一定要有name 属性
// 表单提交数据 进行post请求 路由来监听post  /add 这个路由
router.post('/add', (req, res) => {
    // post 请求提交数据 我们怎么样获取post提交过来的参数
    // 请求的时候两个方法 一个是正在传输数据data 一个是传输完毕之后触发的end
    let formData = '';
    req.on('data', (params) => {
        formData += params;
    })

    req.on('end', async () => {
        // console.log(formData);
        let data = querystring.parse(formData);
        // console.log(data);

        // 向数据库里面添加数据
        // 写法一
        // myInfor.create(data).then(res => {
        //     console.log(res);
        // })
        // 写法二
        let scuessData = await myInfor.create(data);
        // console.log(scuessData);
    });
    // 跳转到/list 路由 // 301重定向到/list
    res.writeHead(301, {
        Location:'/list'
    })

    res.end('post add');
})

// 修改功能 更新功能
router.get('/modify', async (req, res) => {
    /* 
        1.获取当前传递过来的id
        2.根据id 去数据库里面查询对应数据
        3.把查询出来的数据通过模板引擎渲染
    */
    modfiyId = url.parse(req.url, true).query.id;

    let findData = await myInfor.findOne({
        _id:modfiyId
    })
    
    // console.log(findData);
    let html = template('index2', findData)
    res.end(html);
})

// 修改完提交POST请求
router.post('/modify', (req, res) => {
    let formData = '';
    req.on('data', (params) => {
        formData += params;
    })
    req.on('end', async () => {
        let obj = querystring.parse(formData);
        //更新数据库
        let upData = await myInfor.updateOne({ _id: modfiyId }, obj);
        // console.log(upData);
        res.writeHead(301, {
            Location:'/list'
        })
        res.end()
    })

})

//删除功能
router.get('/remove',async (req, res) => {
    /* 
        1.获取当前传递过来的id
        2.根据id 去数据库里面查询 找到对应的进行删掉
        3.重新跳转到/list 路由
    */
    let myId = url.parse(req.url, true).query.id;
    // console.log(myId);
    let deleteData = await myInfor.findOneAndDelete({ _id: myId });
    // console.log(deleteData);

    //从定向后要加上 res.end()
    res.writeHead(301, {
        Location:'/list'
    })
    res.end('get remove');
})


app.on('request', (req, res) => {
    // 路由进行挂载，需要挂载在服务器上
    // 回调函数必须写 可以什么都不触发但是必须要有这个函数
    router(req, res, () => {
        // console.log('路由触发了！');
    })
    // 回调函数必须写 可以什么都不触发但是必须要有这个函数
    serve(req, res, () => {
        // console.log('静态资源托管！');
    })
    // res.end('ok!')
})

app.listen(3000, () => {
    console.log("http://localhost:3000");
})